package br.com.os2.pacemark.dao;

import br.com.os2.pacemark.model.Hospital;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * Classe HospitalDAO, extende a classe DAOGenerico para obeter recursos de
 * conexão e excução de consultas e comandos.
 *
 * Responsável por gerenciar acesso ao banco de dados relacionados a Entidade
 * Hospital.
 *
 * @author Daniel
 *
 */
public class HospitalDAO extends DAOGenerico {

    /**
     * Método para inserir um hospital.
     *
     * @param hospital Objeto hospital a ser inserido.
     * @return boolean indica se o método foi executado com sucesso.
     *
     *
     */
    public boolean inserir(Hospital hospital) {

        hospital.setId(getNextId("hospitais"));
        
        return executarComando("INSERT INTO hospitais (id, nome, endereco_id, "
                             + "contato_id, documento_id) VALUES (?,?,?,?,?)"
                             , hospital.getId(), hospital.getNome()
                             , hospital.getEndereco().getId(), hospital.getContato().getId()
                             , hospital.getDocumento().getId());

    }

    /**
     * Método para atualizar informações de um hospital.
     *
     * @param hospital Objeto hospital a ser atualizado.
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean atualizar(Hospital hospital) {

        return executarComando("UPDATE hospitais SET nome = ?, endereco_id = ?, "
                             + "contato_id = ?, documento_id = ? WHERE id = ? "
                , hospital.getNome(), hospital.getEndereco().getId()
                , hospital.getContato().getId(), hospital.getDocumento().getId()
                , hospital.getId());

    }

    /**
     * Método para excluir um hospital.
     *
     * @param hospital Objeto hospital a ser excluído.
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(Hospital hospital) {

        boolean result =  executarComando("DELETE FROM hospitais WHERE id = ?", hospital.getId());
        
        new DocumentoDAO().excluir(hospital.getDocumento());
        new EnderecoDAO().excluir(hospital.getEndereco());
        new ContatoDAO().excluir(hospital.getContato());
        
        return result;

    }

    /**
     * Método para excluir um hospital.
     *
     * @param id ID do objeto a ser excluído
     * @return boolean indica se o método foi executado com sucesso
     *
     *
     */
    public boolean excluir(int id) {

        return executarComando("DELETE FROM hospitais WHERE id = ?", id);

    }

    /**
     * Método para buscar o hospital pelo ID
     *
     * @return Hospital correspondente ai ID, se não for encontrado retorna
     * null.
     *
     * @param id inteiro que representa o ID do hospital na tabela
     *
     *
     */
    public Hospital getById(int id) {

        ResultSet rs = executarConsulta("SELECT * FROM hospitais WHERE id = ?", id);

        Hospital hospital = null;

        try {

             //DAO's necessários para preencher informações do Hospital
            ContatoDAO contatoDAO = new ContatoDAO();
            EnderecoDAO enderecoDAO = new EnderecoDAO();
            DocumentoDAO documentoDAO = new DocumentoDAO();

            if (rs.next()) {

                hospital = polularInformacoes(rs, contatoDAO, enderecoDAO, documentoDAO);

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO BUSCAR HOSPITAL POR ID");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return hospital;

    }

    /**
     * Método para listagem de hospitais.
     *
     * @return Retorna uma lista de hospitais com o resultado da consulta
     *
     *
     */
    public List<Hospital> listar() {

        List<Hospital> hospitais = new ArrayList<>();

        ResultSet rs = executarConsulta("SELECT * FROM hospitais");

        try {

            //DAO's necessários para preencher informações do Hospital
            ContatoDAO contatoDAO = new ContatoDAO();
            EnderecoDAO enderecoDAO = new EnderecoDAO();
            DocumentoDAO documentoDAO = new DocumentoDAO();

            while (rs.next()) {

                hospitais.add(polularInformacoes(rs, contatoDAO, enderecoDAO, documentoDAO));

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO PERCORER RESULT_SET");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return hospitais;

    }

    /**
     * Método para pesquisar hospitais por nome.
     *
     * Retorna um ResultSet com os resultados
     *
     * @param nome Variável para pesquisa
     *
     *
     */
    public List<Hospital> listar(String nome) {

        List<Hospital> hospitais = new ArrayList<>();

        ResultSet rs = executarConsulta("SELECT * FROM hospitais "
                + "WHERE UPPER(nome) LIKE ? "
                + "ORDER BY id", "%" + nome.toUpperCase() + "%");

        try {

            //DAO's necessários para preencher informações do Hospital
            ContatoDAO contatoDAO = new ContatoDAO();
            EnderecoDAO enderecoDAO = new EnderecoDAO();
            DocumentoDAO documentoDAO = new DocumentoDAO();

            while (rs.next()) {

                hospitais.add(polularInformacoes(rs, contatoDAO, enderecoDAO, documentoDAO));

            }

        } catch (SQLException ex) {

            System.err.println("ERRO AO PERCORER RESULT_SET");

        } finally {

            try {

                rs.close();
                connection.close();

            } catch (SQLException ex) {

            }

        }

        return hospitais;

    }

    /**
     * Método para preencher informações de um hospital com resultados do banco
     * de dados.
     *
     * @param rs ResultSet com o resultado de uma consulta SQL
     *
     * @param contatoDAO DAO de Contato
     *
     * @param enderecoDAO DAO de Endereco
     *
     * @param documentoDAO DAO de Documento
     *
     * @return Retorna um hospital populado com informações vindas do banco de
     * dados
     *
     *
     */
    public Hospital polularInformacoes(ResultSet rs, ContatoDAO contatoDAO,
                                       EnderecoDAO enderecoDAO, DocumentoDAO documentoDAO) {

        Hospital hospital = new Hospital();

        try {

            hospital.setId(rs.getInt("id"));
            hospital.setNome(rs.getString("nome"));
            hospital.setContato(contatoDAO.getById(rs.getInt("contato_id")));
            hospital.setEndereco(enderecoDAO.getById(rs.getInt("endereco_id")));
            hospital.setDocumento(documentoDAO.getById(rs.getInt("documento_id")));

        } catch (SQLException ex) {

            System.err.println("ERRO AO PULULAR HOSPITAL");

        }

        return hospital;

    }

}
